home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / ingres04.lzh / source / parser / s_operator.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-03-23  |  1.5 KB  |  77 lines

  1. # include <ingres.h>
  2. # include "scanner.h"
  3. # include    <sccs.h>
  4. # include    <errors.h>
  5.  
  6. SCCSID(@(#)s_operator.c    8.2    3/23/85)
  7.  
  8. /*
  9. ** OPERATOR
  10. ** an operator is defined as any 1-3 character sequence of
  11. ** non-alphanumerics.  It looks up each operator in 'Optab'
  12. ** and returns the appropriate token.
  13. */
  14. operator(chr)
  15. char    chr;
  16. {
  17.     extern int        yylval;
  18.     extern char        Cmap[];
  19.     register struct optab    *op;
  20.     register int        save;
  21.     char            buf[4];
  22.  
  23.     /* get lookahead characer */
  24.     save = Lcase;
  25.     Lcase = 0;
  26.     buf[0] = chr;
  27.     buf[1] = get_scan(NORMAL);
  28.     buf[2] = get_scan(NORMAL);
  29.     buf[3] = '\0';
  30.  
  31.     /* is it a floating fraction without leading zero ? */
  32.     if (buf[0] == '.' && Cmap[buf[1]] == NUMBR)
  33.     {
  34.         Lcase = save;
  35.         backup(buf[2]);
  36.         backup(buf[1]);
  37.         return(number(chr));
  38.     }
  39.  
  40.     /* three character operator ? */
  41.     for (op = &Optab[0]; op->term; op++)
  42.         if (sequal(op->term, buf))
  43.             break;
  44.     if (!op->term)
  45.     {
  46.         /* two character operator ? */
  47.         backup(buf[2]);
  48.         buf[2] = '\0';
  49.         for (op = &Optab[0]; op->term; op++)
  50.             if (sequal(op->term, buf))
  51.                 break;
  52.         if (!op->term)
  53.         {
  54.             backup(buf[1]);
  55.             buf[1] = '\0';
  56.             for (op = &Optab[0]; op->term; op++)
  57.                 if (sequal(op->term, buf))
  58.                     break;
  59.             if (!op->term)
  60.             {
  61.                 Lcase = save;
  62.                 /* invalid operator */
  63.                 par_error (BADOP, WARN, 0);
  64.             }
  65.         }
  66.     }
  67.     Lcase = save;
  68.     if(op->token == Tokens.bgncmnt)
  69.         return(comment());
  70.     if(op->token == Tokens.sconst)
  71.         return (string(op));
  72.     Lastok.tok = op->term;
  73.     Lastok.toktyp = Tokens.sconst;
  74.     yylval = op->opcode;
  75.     return (op->token);
  76. }
  77.